home *** CD-ROM | disk | FTP | other *** search
-
- /***************************************************************************
-
- XMAIN.C
-
- - main routine, GEM routines, etc.
-
- 01/23/88 created
- 03/03/88 Laser C
-
- 07/27/88 08:30
-
- ***************************************************************************/
-
- #include <stdio.h>
- #include <osbind.h>
- #include <obdefs.h>
- #include <gemdefs.h>
- #include <strings.h>
- #include "x4merII2.h"
- #include "xglobal.h"
- #include "xatari.h"
-
-
- int appl_id ; /* our application ID */
- int phys_handle; /* physical workstation handle */
- int handle; /* virtual workstation handle */
- int xdesk,ydesk,hdesk,wdesk;
-
- int contrl[12];
- int intin[128];
- int ptsin[128];
- int intout[128];
- int ptsout[128];
- int work_in[11];
- int work_out[57];
-
- int fHidden;
- int dummy;
-
- OBJECT *objMainMenu, *objMenuBar, *objLoRez, *objSendCash, *objConfAtari;
- OBJECT *objShare1, *objShare2, *objKey, *objMon, *objAtari, *objApple;
- OBJECT *objOther, *objCredits, *objHelp0, *objUnispec, *objCricit;
- OBJECT *objMegamax, *objWordPerf;
-
- /****************************************************************/
-
- long lEmul; /* == arEmul */
- long lRStat; /* == arRSTAT */
- long lWStat; /* == arWSTAT */
- long lMemory; /* start of 6502 memory */
-
- /* these variables are not directly used by the interpreter */
- int fIsMono;
- long lScr, lScrGEM;
- long lFreeSpace; /* used by individual machines */
- long lScratch; /* a 32K buffer for misc. uses */
-
- /* pointers to the 2 system fonts */
- long lFont8, lFont16;
-
- /* these guys keep track of the machine and ROM type */
- int mdMachine = FILEGENE;
-
- /* anytime ROM is changed, must reboot */
- int fReboot = TRUE;
-
- int rgwPalette[16] =
- {
- 0x777, 0x622, 0x476, 0x200
- };
-
- int rgwPaletteSav[16];
-
- char szAppleROM[] = "AP*.STX";
- char szC64ROM[] = "C64*.STX";
-
- char *rgszNames[5] =
- {
- " Generic 6502 ",
- " Atari 400/800 ",
- " Atari 800XL/65XE ",
- " Apple II 48K ",
- " Commodore 64 "
- };
-
- /****************************************************************/
-
- main()
- {
- int i;
- long lHeap;
-
- appl_id = appl_init();
- phys_handle=graf_handle(&dummy,&dummy,&dummy,&dummy);
- wind_get(0, WF_WORKXYWH, &xdesk, &ydesk, &wdesk, &hdesk);
-
- for(i=0;i<10;work_in[i++]=1);
- work_in[10]=2;
- handle=phys_handle;
- v_opnvwk(work_in,&handle,work_out);
- graf_mouse(ARROW,0x0L);
-
- #ifdef NEVER
- if (rsrc_load("x4merII2.rsc")==0)
- {
- form_alert(1,"[1][ _X4MERII2.RSC | not found! ][ tsk-tsk ]");
- goto lQuit2;
- }
- #else
- fix_tree();
- #endif
- rsrc_gaddr(0, MAINMENU, &objMainMenu);
- rsrc_gaddr(0, MENUBAR, &objMenuBar);
- rsrc_gaddr(0, SENDCASH, &objShare1);
- rsrc_gaddr(0, SENDCAS2, &objShare2);
- rsrc_gaddr(0, HELP0, &objHelp0);
- rsrc_gaddr(0, KEYBOARD, &objKey);
- rsrc_gaddr(0, MONITOR, &objMon);
- rsrc_gaddr(0, HLPATARI, &objAtari);
- rsrc_gaddr(0, HLPAPPLE, &objApple);
- rsrc_gaddr(0, HLPOTHER, &objOther);
- rsrc_gaddr(0, CONFATAR, &objConfAtari);
- rsrc_gaddr(0, CREDITS, &objCredits);
- rsrc_gaddr(0, UNISPEC, &objUnispec);
- rsrc_gaddr(0, CRICIT, &objCricit);
- rsrc_gaddr(0, TMEGAMAX, &objMegamax);
- rsrc_gaddr(0, WPAD, &objWordPerf);
-
- /* objMenuBar[FILEAPPL].ob_state |= DISABLED; */
- /* objMenuBar[FILEC64].ob_state |= DISABLED; */
-
- Blit (" -- off -- ", ((TEDINFO *)objConfAtari[ATARIDR1].ob_spec)->te_ptext + 5);
- Blit (" -- off -- ", ((TEDINFO *)objConfAtari[ATARIDR2].ob_spec)->te_ptext + 5);
-
- for (i=0; i<16; i++)
- rgwPaletteSav[i] = Setcolor(i, -1);
- Setpalette(rgwPalette);
-
- if (((lHeap = Malloc(630L*1024L)) == -1L) || (lHeap == 0L))
- {
- if (((lHeap = Malloc(540L*1024L)) == -1L) || (lHeap == 0L))
- {
- form_alert(1,"[1][ insufficient memory! ][ bye-bye! ]");
- goto lQuit2;
- }
- fDDenable = FALSE;
- }
- else
- {
- fDDenable = TRUE;
- }
-
- if (Getrez() == 0)
- {
- form_alert(1,"[1][ Please switch to | medium rez. ][ OK ]");
- goto lQuit2;
- }
-
- /* we have a heap, initialize it */
- lMemory = ((lHeap + 65535L) & 0xFFFF0000L);
- lRStat = lMemory + 65536L + 32768L;
- lWStat = lRStat + 32768L;
- lEmul = lWStat + 65536L;
- lFreeSpace = lEmul + 32768L;
-
- /* always make sure that lScr is last in case graphics overflow */
- if (lMemory - lHeap > 32767L)
- {
- lScratch = lMemory - 32768L;
- lScr = lFreeSpace + 184320L + (fDDenable ? 92160L : 0);
- }
- else
- {
- lScratch = lFreeSpace + 184320L + (fDDenable ? 92160L : 0);
- lScr = lScratch + 32768L;
- }
-
- fIsMono = ((Getrez == 2) ? ~0 : 0);
- lScrGEM = Physbase();
-
- /* initialize text plotting routines to bypass GEM */
- asm {
- dc.w 0xA000 ; returns A1 = pointer to array of font headers
- move.l 4(A1),A0 ; pointer to 8x8 font
- move.l 76(A0),lFont8
- move.l 8(A1),A0 ; pointer to 8x16 font
- move.l 76(A0),lFont16
- }
-
- init_heap();
- init_atari();
-
- #ifdef NDEBUG
- printf("\033EHeap locations: lHeap: $%5lx\n",lHeap);
- printf("(Dispatcher) lEmul: $%5lx ",lEmul);
- printf("(6502 main memory) lMemory: $%5lx\n", lMemory);
- printf("lRStat: $%5lx lWStat: $%5lx\n",lRStat, lWStat);
- printf("(display screen) lScr: $%5lx\n",lScr);
- printf("(Free Space: $%5lx ",lFreeSpace);
- printf("Desktop screen: $%5lx ",lScrGEM);
- printf("fMono: %d\n",fIsMono);
- #endif
-
- #ifdef NDEBUG
- printf("\033H\n\nlEmul = $%5lx lMemory = $%5lx ", lEmul, lMemory);
- printf("lRStat = $%5lx lWStat = $%5lx\n",
- lRStat, lWStat);
- printf("&lEmul = $%5lx &lMemory = $%5lx", &lEmul, &lMemory);
- printf("&lRStat = $%5lx &lWStat = $%5lx\n",
- &lRStat, &lWStat);
- #endif
-
- /* everything OK, show menu bar and title */
- menu_bar (objMenuBar, TRUE);
- do_dialog(objMainMenu, TRUE);
- do_dialog(objShare2, TRUE);
-
- /* go do something */
- multi();
-
- menu_bar (objMenuBar, FALSE);
-
- lQuit:
- Mfree(lHeap);
- lQuit2:
- v_clsvwk(handle);
- appl_exit();
- Setpalette(rgwPaletteSav);
- exit(0);
- }
-
-
- hide_mouse()
- {
- if(!fHidden)
- {
- graf_mouse(M_OFF,0x0L);
- fHidden=TRUE;
- }
- }
-
- show_mouse()
- {
- if(fHidden)
- {
- graf_mouse(M_ON,0x0L);
- fHidden=FALSE;
- }
- }
-
- do_dialog(dialog, fDo)
- OBJECT *dialog;
- int fDo;
- {
- int but=0;
- int cx, cy, cw, ch, xc, yc;
-
- while (Bconstat(2))
- Bconin(2);
-
- /* center the dialog box */
- form_center(dialog, &cx, &cy, &cw, &ch);
-
- xc = cx + cw/2 ;
- yc = cy + ch/2 ;
-
- #ifndef NEVER
- if (fDo)
- {
- form_dial(FMD_START, 0,0,0,0, xdesk, ydesk, wdesk, hdesk);
- form_dial(FMD_GROW, xc,yc,0,0, cx, cy, cw, ch);
- }
- #endif
-
- objc_draw(dialog, 0, 10, cx, cy, cw, ch);
-
- if (!fDo)
- return 0;
-
- but=form_do(dialog,0);
- dialog[but].ob_state &= ~SELECTED;
-
- #ifndef NEVER
- form_dial(FMD_SHRINK, xc,yc,0,0, cx, cy, cw, ch);
- form_dial(FMD_FINISH, 0,0,0,0, xdesk, ydesk, wdesk, hdesk);
- #endif
-
- return(but);
- }
-
-
- multi()
- {
- int wEvent, fQuit=FALSE, h;
- int rgwMsgBuff[16];
- do
- {
- evnt_mesag(rgwMsgBuff);
-
- wEvent = rgwMsgBuff[0];
-
- if (wEvent == WM_REDRAW)
- {
- continue;
- }
- else if (wEvent != MN_SELECTED)
- {
- Assert(FALSE,"xmain.c: unknown event");
- continue;
- }
-
- switch(rgwMsgBuff[3])
- {
- default:
- Assert(FALSE,"unknown menu entry!!!!!!!!!");
- break;
-
- case DESK:
- do_dialog(objMainMenu, TRUE);
- break;
-
- case FILE:
- {
- int md;
-
- switch (md=rgwMsgBuff[4])
- {
- default:
- break;
-
- case FILECOLD:
- Lnogo:
- if (mdMachine == FILEGENE)
- {
- form_alert(1,
- "[0][ Use 6502 Monitor | for Generic mode ][ OK ]");
- break;
- }
- hide_mouse();
- if (mdMachine == FILEATAR)
- setup_atari();
- else if (mdMachine == FILEAPPL)
- setup_apple();
- ColdStart();
- show_mouse();
- break;
-
- case FILECONT:
- if (mdMachine == FILEGENE)
- goto Lnogo;
- hide_mouse();
- Continue();
- show_mouse();
- break;
-
- case FILEGENE:
- if (mdMachine != FILEGENE)
- {
- fReboot = TRUE;
- objMenuBar[mdMachine].ob_state &= ~CHECKED;
- objMenuBar[mdMachine=md].ob_state |= CHECKED;
- set_menu(0);
- }
- break;
-
- case FILEATAR:
- {
- if (mdMachine != FILEATAR)
- {
- objMenuBar[mdMachine].ob_state &= ~CHECKED;
- objMenuBar[mdMachine=md].ob_state |= CHECKED;
- fReboot = TRUE;
- }
- else
- fReboot = FALSE;
-
- /* if person pressed Reconfigure, or this is the
- ** first time in the config box, force a reboot */
-
- fReboot = conf_atari() || fReboot;
-
- fFastIO =
- objConfAtari[CONFFAST].ob_state & SELECTED;
- rgAD[0].fWP =
- objConfAtari[CONFWP1].ob_state & SELECTED;
- rgAD[1].fWP =
- objConfAtari[CONFWP2].ob_state & SELECTED;
-
- if (!fReboot)
- {
- set_menu(fAtariXL ? 2 : 1);
- break;
- }
-
- fAtCart =
- objConfAtari[CONFCART].ob_state & SELECTED;
- fFastFP =
- objConfAtari[CONFFP].ob_state & SELECTED;
- fAtariXLROMs =
- objConfAtari[CONFXLXE].ob_state & SELECTED;
- fAtariXL =
- objConfAtari[CONFMEM3].ob_state & SELECTED |
- objConfAtari[CONFMEM4].ob_state & SELECTED;
- wVBIrate = 1 +
- ((objConfAtari[ATARVBI2].ob_state & SELECTED) ? 1 : 0) +
- ((objConfAtari[ATARVBI3].ob_state & SELECTED) ? 1 : 0);
-
- if ( objConfAtari[CONFMEM0].ob_state & SELECTED )
- uAtRAM = 32768;
- else if ( objConfAtari[CONFMEM1].ob_state & SELECTED )
- uAtRAM = 40960;
- else
- uAtRAM = 49152;
-
- set_menu(fAtariXL ? 2 : 1);
- setup_atari();
- }
- break;
-
- case FILEAPPL:
- if (mdMachine != FILEAPPL)
- {
- int h;
-
- if ((h = Fopen (szAppleROM,0))<0)
- {
- form_alert(1,
- "[0][ file not found! ][ See Manual ]");
- break;
- }
- if (Fread(h,12288L, lScratch)<0)
- {
- form_alert(1,
- "[0][ error reading file ][ See Manual ]");
- break;
- }
- Fclose (h);
-
- fReboot = TRUE;
- objMenuBar[mdMachine].ob_state &= ~CHECKED;
- objMenuBar[mdMachine=md].ob_state |= CHECKED;
- set_menu(3);
-
- setup_apple();
- }
- break;
-
- case FILEC64:
- if (mdMachine != FILEC64)
- {
- int h;
-
- if ((h = Fopen (szC64ROM,0))<0)
- {
- form_alert(1,
- "[0][ file not found! ][ See Manual ]");
- break;
- }
- if (Fread(h,16384L, lScratch)<0)
- {
- form_alert(1,
- "[0][ error reading file ][ See Manual ]");
- break;
- }
- Fclose (h);
-
- fReboot = TRUE;
- objMenuBar[mdMachine].ob_state &= ~CHECKED;
- objMenuBar[mdMachine=md].ob_state |= CHECKED;
- set_menu(4);
-
- setup_c64();
- }
- break;
-
- case FILESAVE:
- {
- int h, i=0;
- char *szSavePic = "x4mer000.pi1";
-
- if (fIsMono)
- {
- szSavePic[11] = '3';
- i = 2;
- }
-
- h = Fcreate(szSavePic, 0);
- if (h>=0)
- {
- Fwrite(h, 2L, &i);
- Fwrite(h, 32L, rgwAtColors);
- Fwrite(h, 32000L, lScr+3840L);
- Fclose(h);
-
- /* increment filename */
- if (++szSavePic[7] > '9')
- {
- szSavePic[7] = '0';
- if (++szSavePic[6] > '9')
- {
- szSavePic[6] = '0';
- if (++szSavePic[5] > '9')
- {
- szSavePic[5] = '0';
- }
- }
- }
- }
- }
- break;
-
- case FILE6502:
- hide_mouse();
- menu_tnormal(objMenuBar,rgwMsgBuff[3],1) ;
- mon();
- redraw_desktop(TRUE);
- show_mouse();
- break;
- case FILEQUIT:
- fQuit = TRUE;
- break;
- }
- break;
- case HELP:
- switch (rgwMsgBuff[4])
- {
- default:
- Assert(FALSE,"unknown HELP selection");
- break;
- case HELPSTAR:
- do_dialog(objHelp0, TRUE);
- break;
- case HELPDOCS:
- do_dialog(objShare1, TRUE);
- do_dialog(objShare2, TRUE);
- break;
- case HELPKEYS:
- do_dialog(objKey, TRUE);
- break;
- case HELPMON:
- do_dialog(objMon, TRUE);
- break;
- case HELPATAR:
- do_dialog(objAtari, TRUE);
- break;
- case HELPAPPL:
- do_dialog(objApple, TRUE);
- break;
- case HELPOTHR:
- do_dialog(objOther, TRUE);
- break;
- case HELPKISS:
- h = do_dialog(objCredits, TRUE);
- if (h == HELPTRIO)
- {
- if (fIsMono)
- do_dialog(objUnispec, TRUE);
- else
- {
- hide_mouse();
- do_dialog(objUnispec, FALSE);
- delay(3000);
- uni_demo_on();
- Bconin(2);
- uni_demo_off();
- show_mouse();
- redraw_desktop(FALSE);
- }
- }
- else if (h == HELPQMI)
- {
- qmi_demo(lScratch, handle);
- redraw_desktop(TRUE);
- }
- else if (h == HELPCRIC)
- {
- do_dialog(objCricit, TRUE);
- }
- else if (h == HELPWORD)
- {
- do_dialog(objWordPerf, TRUE);
- }
- else
- {
- do_dialog(objMegamax, TRUE);
- }
- break;
- }
- break;
- }
- }
-
- menu_tnormal(objMenuBar,rgwMsgBuff[3],1) ;
- } while(!fQuit);
- }
-
- /* returns TRUE if Reconfigure was pressed */
- int conf_atari()
- {
- int but, wAlert, wExit;
- char szPath[80], szName[15];
- register char *pch;
-
- static char *rgszDens[4] =
- {
- "---",
- "SNG",
- "ENH",
- "DBL"
- };
-
- do
- {
- but = do_dialog(objConfAtari, TRUE);
-
- if (but == ATARLOAD)
- {
- wAlert = form_alert(1,
- "[0][ Load which drive? ][D1:|D2:|Cancel]");
- if (--wAlert < 2)
- {
- Blit (rgAD[wAlert].rgchPath, szPath);
- if (szPath[strlen(szPath)-1] == '\\')
- strcat(szPath, fDDenable ? "*.?D" : "*.SD");
- else
- strcat(szPath, fDDenable ? "\\*.?D" : "\\*.SD");
- szName[0] = 0;
-
- while (fsel_input(szPath, szName, &wExit) == 0)
- ;
-
- if (wExit != 1)
- {
- rgAD[wAlert].mdDensity = 0;
- continue;
- }
-
- Blit (szPath, rgAD[wAlert].rgchPath);
- Blit (szName, rgAD[wAlert].rgchName);
- atari_load(wAlert);
- }
- }
- else if (but == ATARSAVE)
- {
- wAlert = form_alert(1,
- "[0][ Save which drive? ][D1:|D2:|Cancel]");
- if (--wAlert < 2)
- {
- Blit (rgAD[wAlert].rgchPath, szPath);
- if (szPath[strlen(szPath)-1] == '\\')
- strcat(szPath, fDDenable ? "*.?D" : "*.SD");
- else
- strcat(szPath, fDDenable ? "\\*.?D" : "\\*.SD");
- szName[0] = 0;
-
- while (fsel_input(szPath, szName, &wExit) == 0)
- ;
-
- if (wExit != 1)
- continue;
-
- Blit (szPath, rgAD[wAlert].rgchPath);
- Blit (szName, rgAD[wAlert].rgchName);
- atari_save(wAlert);
- }
- }
- else if (but == CONFD1)
- {
- hide_mouse();
- atari_dir(0);
- show_mouse();
- redraw_desktop(TRUE);
- }
- else if (but == CONFD2)
- {
- hide_mouse();
- atari_dir(1);
- show_mouse();
- redraw_desktop(TRUE);
- }
-
- if (rgAD[0].mdDensity == 0)
- {
- Blit (" -- off -- ",
- ((TEDINFO *)objConfAtari[ATARIDR1].ob_spec)->te_ptext + 5);
- }
- else
- {
- Blit (rgAD[0].rgchName,
- ((TEDINFO *)objConfAtari[ATARIDR1].ob_spec)->te_ptext + 5);
- }
-
- if (rgAD[1].mdDensity == 0)
- {
- Blit (" -- off -- ",
- ((TEDINFO *)objConfAtari[ATARIDR2].ob_spec)->te_ptext + 5);
- }
- else
- {
- Blit (rgAD[1].rgchName,
- ((TEDINFO *)objConfAtari[ATARIDR2].ob_spec)->te_ptext + 5);
- }
-
- sprintf(((TEDINFO *)objConfAtari[ATARSTD1].ob_spec)->te_ptext + 11,
- "%3.3s Free: %03d", rgszDens[rgAD[0].mdDensity],
- free_secs(0));
- sprintf(((TEDINFO *)objConfAtari[ATARSTD2].ob_spec)->te_ptext + 11,
- "%3.3s Free: %03d", rgszDens[rgAD[1].mdDensity],
- free_secs(1));
-
- } while ((but != CONFEXIT) && (but != CONFCONF));
- return (but == CONFCONF);
- }
-
-
- delay(cms)
- int cms;
- {
- evnt_timer(cms,0);
- }
-
- redraw_desktop(fMenu)
- int fMenu;
- {
- hide_mouse();
- wind_update(TRUE);
-
- if (fMenu)
- {
- menu_bar (objMenuBar, FALSE);
- menu_bar (objMenuBar, TRUE);
- }
-
- form_dial(FMD_START, 0,0,0,0, xdesk, ydesk, wdesk, hdesk);
- form_dial(FMD_FINISH, 0,0,0,0, xdesk, ydesk, wdesk, hdesk);
- wind_update(FALSE);
- show_mouse();
- Setpalette(rgwPalette);
- }
-
- /* change the disable menu entry to a new string in rgszNames[isz] */
- /* and redraw menu bar */
- set_menu(isz)
- int isz;
- {
- menu_text(objMenuBar, MENUSTAT, rgszNames[isz]);
- menu_bar (objMenuBar, FALSE);
- menu_bar (objMenuBar, TRUE);
- }
-
- #ifdef DEBUG
-
- void _alert(pch)
- register char *pch;
- {
- register int fPrinter;
-
- fPrinter = Cprnos();
-
- Cconws("\033j\033H\033p\033lAssertion failed: ");
- while (*pch)
- {
- if (fPrinter)
- Cprnout((int)*pch);
- Bconout(2,(int)*pch++);
- }
- if (fPrinter)
- {
- Cprnout(13);
- Cprnout(10);
- }
- Cconws("\033q\003l\033k\007");
- Bconin(2);
- }
-
- #endif
-
-